# 不可变对象 str

# mystr = 'abcdefg'
# mystr[6] = 'm'





# 有数据的列表
my_list = ["zhong", "zhangsi", "zhibo"]
print(my_list)
i_list = [1, 2, 3]
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list, id]
print(my_list)

# 空列表
my_list = []
print(my_list)
my_list = list()
print(my_list)


# 类型转换
my_str = 'abcdef abc'
my_list = list(my_str) # list函数接收一个可迭代对象 iterable
print(my_list)
my_list = my_str.split(' ') # => my_list = my_str.split()
print(my_list)

# my_int = 1234567
# #TypeError: 'int' object is not iterable
# my_list = list(my_int)
# print(my_list)


# 索引（每次只取一个元素）
i_list = [1, 2, 3]
# 有序数列， 下标从0开始
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list, id]
print(my_list[1])
print(my_list[6])
print(my_list[6][1])
# # 下标越界 # IndexError: list index out of range
# # 最大下标：my_list的长度-1
# print(my_list[100])

# # 下标范围：-1 - -N
print(my_list[-2])
print(my_list[-2][1])
# # IndexError: list index out of range
# print(my_list[-100])


# 切片
# listname[start:end:step]
# start,end,step选填参数
# start: 默认是最小的索引
# end: 默认是最大的索引
# step：步长


i_list = [1, 2, 3]
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list, id]
# [0,3)
# 正切片
print(my_list[0:3])
# 负切片
print(my_list[-8:-5])


print(my_list[3:0:-1])
# 切片下标问题
print(my_list[0:100:2])


print(my_list[0:])
# 列表翻转 [1,2,3,4] => [4,3,2,1]
# 不是对自身操作
print(my_list[::-1])

# slice切片：给切片命名
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
print(my_list[0:3:1])
fruit = slice(0, 3, 1)
print(type(fruit)) # class slice
print(my_list[fruit])

# 函数/方法调用的时候用`()`
# 变量取值的时候用`[]`


# 列表的增删改查
# print(dir(my_list))
# print(help(my_list.append))


# append: 在列表最后增加， 修改列表本身
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
my_list.append('西瓜')
my_list.append(1)
my_list.append(['a', 'b', 'c'])
print(my_list)

# insert: 在index位置插入数据，修改列表本身
# 2个参数，index, 插入的元素
# 将元素作为整体插入
my_list.insert(1, 'pear')
print(my_list)
my_list.insert(1, ['a', 'b', 'c'])
print(my_list)

# extend: 扩展列表, 修改列表本身， 扩展的对象应该可迭代iterable
# 只限可转为list的类型：str, list, tuple

my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
my_list.extend(['a', 'b', 'c'])
my_list.extend('西瓜')
# # TypeError: 'int' object is not iterable
# my_list.extend(1)
print(my_list)

# +
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
print(my_list + ['a', 'b', 'c'])

# # TypeError: can only concatenate list (not "str") to list
# print(my_list + '西瓜')

# print(my_list+1)
print(my_list)

### extend与+的区别
# extend对自身修改，返回None
# + 拼接成一个新的列表
# extend可以加字符串
# + 不可以加字符串


####### 删除 ######
# pop：删除列表元素，默认是删除最后一个, 对列表自身修改
# pop([index])
print("#"*30,"删除")
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
my_list.pop()
print(my_list)
my_list.pop(1)
print(my_list)

# remove, 删除指定元素数据, 对列表自身修改
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
# # TypeError: remove() takes exactly one argument (0 given)
# my_list.remove()
my_list.remove(False)
print(my_list)

# del，按下标删除，一次性删除多个
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
del my_list[0]
del my_list[0:2]
print(my_list)


# clear， 清空列表
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
my_list.clear()
print(my_list)


### 修改数据
my_list = ['apple', 'banana', 'orange', 1, 3.14, False, i_list]
my_list[0] = 'pear'
print(my_list)





### 列表翻转: reverse
my_list = ['apple', 'apple', 'banana', 'orange', 1, 3.14, False, i_list]
print(my_list[::-1])
# reverse是对自身做操作
print(my_list.reverse())
print(my_list)

## 列表排序
# TypeError: '<' not supported between instances of 'int' and 'str'
my_list = ['apple', 'banana', 'orange', 1, 3.14, i_list]

# 排序->列表的数据类型需要一致
my_list = ['apple', 'orange', 'banana', 'Orange']
print(my_list.sort())     # 对自身进行操作
print(my_list)

### 统计
my_list = ['apple', 'apple', 'banana', 'orange', 1, 3.14, False, i_list]
### 统计长度
print(len(my_list))
### 统计：count, 统计元素出现的次数
print(my_list.count('apple'))
### 统计：index, 第一次出现的位置，如果不存在，会报异常
print(my_list.index('orange'))
# ValueError: 'orange1' is not in list
# print(my_list.index('orange1'))


## 遍历数据
my_list = ['apple', 'apple', 'banana', 'orange', 1, 3.14, False, i_list]
for item in my_list:
    print(item)

# 打印元素及下标
i = 0
for item in my_list:
    print(i, item)
    i = i+1

# enumerate 枚举函数，
print(list(enumerate(my_list)))
# [(0, 'apple'), (1, 'apple'), (2, 'banana'), (3, 'orange'), (4, 1), (5, 3.14), (6, False), (7, [1, 2, 3])]


for item in enumerate(my_list):
    print(item)


for index, item  in enumerate(my_list):
    print(index, item)

## 取数据的时候，元素的个数必须要与变量数目一致

# index , item, item2 = (0, 'apple')
# print(index, item, item2)

# ValueError: too many values to unpack (expected 2)
# index , item= (0, 'apple', 'orange')
# print(index, item)



### 判断成员关系
# in , not in
singer = ['李圣杰', '张韶涵', '汪峰']
print('林志炫' in singer)
print('张韶涵' in singer)
print('张韶涵' not in singer)
print('林志炫' not in singer)


# >>> a = ['apple', 'orange', 123, 0.11]
# >>> a
# ['apple', 'orange', 123, 0.11]
# >>> type(a)
# <class 'list'>
# >>> a.append('我是追加')
# >>> a
# ['apple', 'orange', 123, 0.11, '我是追加']
# >>> print(a[0], a[-1])
# apple 我是追加
# >>> print(a[0], a[len(a)-1])
# apple 我是追加
# >>> a.pop()
# '我是追加'
# >>> a
# ['apple', 'orange', 123, 0.11]
# >>> a.pop(0)
# 'apple'
# >>> a
# ['orange', 123, 0.11]
# >>> if 'a' in a
#   File "<stdin>", line 1
#     if 'a' in a
#               ^
# SyntaxError: invalid syntax
# >>> 'a' in a
# False
# >>> 'apple' in a
# False
# >>> a
# ['orange', 123, 0.11]
# >>> 123 in a
# True
# >>> a[::]
# ['orange', 123, 0.11]
# >>> a[::-1]
# [0.11, 123, 'orange']
# >>> len(a)
# 3
# >>> li = ['liu'，'cali'，123,456]
#   File "<stdin>", line 1
#     li = ['liu'，'cali'，123,456]
#                ^
# SyntaxError: invalid character in identifier
# >>> li = ['liu'，'cali'，123, 456]
#   File "<stdin>", line 1
#     li = ['liu'，'cali'，123, 456]
#                ^
# SyntaxError: invalid character in identifier
# >>> li = ['liu','cali',123, 456]
# >>> a.insert(1, li)
# >>> a
# ['orange', ['liu', 'cali', 123, 456], 123, 0.11]
# >>> a[1:]
# [['liu', 'cali', 123, 456], 123, 0.11]
# >>> a[2:6]
# [123, 0.11]
# >>> a[2:6]
# [123, 0.11]
# >>> a[2:-3]
# []
# >>> a = [1,2,3,4,5,6,7,8,9,10]
# >>> a[2:-3]
# [3, 4, 5, 6, 7]
# >>> a[1:-3]
# [2, 3, 4, 5, 6, 7]
# >>> a[1:-2]
# [2, 3, 4, 5, 6, 7, 8]
# >>>